////////////////////////////////////////////////////////////////////////////////

#ifndef _CLIENTNETWORK_H_
#define _CLIENTNETWORK_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _OBSERVER_H_
#include "observer.h"
#endif

#ifndef _NETWORKFACTORY_H_
#include "networkfactory.h"
#endif

#include <string>

////////////////////////////////////////////////////////////////////////////////

class Buffer;
class Client;
class Packet;
class ClientInfoPacket;
class ClientInputPacket;

////////////////////////////////////////////////////////////////////////////////



/** Game client network manager
*
*  @author   Roman Pasechnik
*  @since    Jun 11th, 2009
*  @updated  Jan 13th, 2010
*/
class ClientNetwork : public Observer
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ClientNetwork();


    /** Destructor */
    ~ClientNetwork();


////////////////////////////////////////////////////////////////////////////////


    /* Start client network */
    void Start( Client* _client, const std::string& _address, const std::string& _nickName);


////////////////////////////////////////////////////////////////////////////////


    /* Send client info packet */
    void SendClientInfo( const ClientInfoPacket& _clientInfoPacket );


    /* Send client input packet */
    void SendClientInput( const ClientInputPacket& _clientInputPacket );


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////
//// Observer interface implementation
////////////////////////////////////////////////////////////////////////////////


    /** Notify observer about event */
    virtual void OnEvent( Event _event, Observable* _observable );


////////////////////////////////////////////////////////////////////////////////


    /** Try to connect to the server */
    void Connect(const std::string& _address, const std::string& _nickName);


    /** TCP Receive handler */
    void HandleReceiveTCP();


    /** UDP Receive handler */
    void HandleReceiveUDP();


////////////////////////////////////////////////////////////////////////////////


    /** Sends TCP packet */
    void SendTCP( const Packet& _packet );


    /** Sends UDP packet */
    void SendUDP( const Packet& _packet );


    /** Composes packet from buffer and processes it */
    void ProcessPacketInBuffer( Buffer& _buffer );


////////////////////////////////////////////////////////////////////////////////


    /** Connection with server */
    ClientConnectionPtr m_Connection;


    /** Client interface */
    Client* m_Client;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////
